/**
在TypeScript中，映射类型是一种通过对已有类型进行转换来创建新类型的方式。映射类型允许开发者根据已有类型的结构生成新的类型，从而提高代码的灵活性和可重用性。
  1. 映射类型的基本概念
  - 映射类型通过对一个类型的所有属性进行遍历，并可以对每个属性应用某种转换规则，从而生成一个新类型。

  2. 基本语法
  - 映射类型的基本语法使用 `keyof` 运算符来获取类型的键，并结合 `in` 关键字进行遍历。

    例如：
  type Person = {
      name: string;
      age: number;
  };

  // 创建一个映射类型，将所有属性的类型变为可选
  type PartialPerson = {
      [K in keyof Person]?: Person[K];
  };

  // PartialPerson 的类型为 { name?: string; age?: number; }
  3. 只读映射类型
  - 可以使用 `readonly` 修饰符来创建只读属性的新类型。

    例如：
  type ReadonlyPerson = {
      readonly [K in keyof Person]: Person[K];
  };

  // ReadonlyPerson 的类型为 { readonly name: string; readonly age: number; }
  4. 条件类型与映射类型结合
  - 可以在映射类型中使用条件类型，根据属性的类型进行不同的转换。

    例如：
  type Nullable<T> = {
      [K in keyof T]: T[K] extends object ? T[K] | null : T[K];
  };

  type NullablePerson = Nullable<Person>;

  // NullablePerson 的类型为 { name: string | null; age: number | null; }
  5. 映射类型与联合类型
  - 映射类型也可以与联合类型结合使用，以生成更复杂的类型。

    例如：
  type Keys = 'name' | 'age';
  type PersonSubset = {
      [K in Keys]: K extends 'name' ? string : number;
  };

  // PersonSubset 的类型为 { name: string; age: number; }
  6. 总结
  映射类型是TypeScript中一个强大的特性，它允许开发者通过对已有类型进行转换来创建新类型。通过使用映射类型，开发者可以灵活地处理类型的属性，生成可选、只读或根据条件变化的新类型。这种特性在构建复杂数据结构和增强类型安全性方面非常有用。映射类型提高了代码的可维护性和可读性，是TypeScript类型系统的重要组成部分。
 */
// TypeScript提供了映射类型: 函数
// 映射类型不能使用interface定义
// Type = IPerson
// keyof = "name" | "age"
type MapPerson<T> = {
  // 索引类型以此进行使用
  [K in keyof T]: T[K];
  // name: string; // 报错 映射的类型可能不声明属性或方法
  // age: number 
}

interface IPerson {
  name: string;
  age: number;
}

type NewPerson = MapPerson<IPerson>;

export {}
